Software continues to grow in size and complexity to take advantage of increasingly powerful hardware and to cater to the diverse needs of a large and growing market. This increase in software size and complexity when combined with diverse usage scenarios makes it difficult for programmers to develop performant applications. The diverse usage scenarios and software complexity also makes it difficult for system administrators to identify and resolve problems.
To build performant software, developers typically use profiling tools that either instrument a program or use hardware performance counters to identify functions that are time-consuming and to focus their efforts on optimizing these functions. However, this methodology suffers from key limitations. First, only a small subset of likely usage scenarios can be profiled and consequently the application may still perform poorly in many circumstances. Second, with multicore processors quickly becoming mainstream, many applications are multi-threaded and function performance is often dependent on understanding the behavior of other application threads that can execute in parallel.